//类（最终还是函数 语法糖）构造函数的区别 函数不会new
//构造函数的特点能new 而且可以调用

//类中的概念 实例的属性 实例共享属性 类来调用：静态属性（方法）

//类中的this 默认不知道自己具备什么属性 ts要做类型检测
class Pointer {
    public x:number = 1;
    public y:number = 2;//如果只添加类型没有复制 ts不能将null 赋值给其它类型
    constructor(x:number,y?:number) {//构造函数和普通函数的参数一样可以支持可选参数 默认参数 剩余参数...arg:number[]
        this.x = x;
        this.y = y!;//考虑安全性 不能将大范围类型 赋予给小范围类型(ts兼容性) !表示非空 或者y as number
        //真正开发使用！和as语法的场景是非常多的
        this.init();
    }
    init(){
        this.y = 200;
    }
}
let r = new Pointer(100);


// 类的修饰符 java(public protected private  readonly)  js中没有 限制访问范围
//public 就意味着公开 自己能访问 儿子能访问 外界能访问
//protected 自己能访问 儿子能访问

//构造函数也可以添加修饰符 除了public之后都不能
class Animal{
    private readonly type:string = '哺乳类'; //仅读只能在初始化的时候修改（只能在构造函数中不能不恩那个在其他地方修改）
    constructor(type:string){
        this.type = type;
    }
    getType(){
        return this.type;
    }
    static flag = '动物'
}
class Dog extends Animal{//
    constructor(){//如果子类写了（继承）constructor 那么子类必须调用super
        super();//Animal.call(this);
    }
}
let dog = new Dog;
console.log(dog.type);

//es6 中静态属性 方法 类的访问起都可以在ts中使用
//静态属性和静态方法 
class Cat extends Animal{
    constructor(){

    }
    get name(){

    }
    set name(){

    }
}

new Cat("哺乳类","Tom");
console.log(Cat.flag);

//类用的越来越少（函数式编程 方便服用） 类继承混乱 vue3有的是用类来写的
//与es6基本一样 多了些类型 重写保持一直 